import functools
# 匿名函数 lambda
L=list(map(lambda x: x * x ,[1,3,5,6,7,9]))
print(L)

# lambda x: x * x 即是匿名函数
# 等同于下面的函数
def f(x):
	return x* x
# 匿名函数有个限制，就是只能有一个表达式，
# 不用写return，返回值就是该表达式的结果
f = lambda x: x*x
print(f(5))

# 装饰器 Decorator
# 由于函数也是一个对象，而且函数对象可以被赋值给变量，
# 所以，通过变量也能调用该函数
def now():
	print('2016-5-12')
f = now
f()
print(now.__name__)
print(f.__name__)

def log(func):
	def wrapper(*args,**kw):
		print("call %s" % func.__name__)
		return func(*args,**kw)
	return wrapper

@log
def _now():
	print('2016-5-12')

_now()

def log(text):
	def decorator(func):
		def wrapper(*args,**kw):
			print("%s %s();" % (text,func.__name__))
			return func(*args,**kw)
		return wrapper
	return decorator

@log("execute")
def _now():
	print('2016-5-12')
_now()
# 但经过decorator装饰之后的函数，
# 它们的__name__已经从原来的'now'变成了'wrapper'
print(_now.__name__)

# 将原来函数的名返回回来，需要作如下操作
def log(text):
	def decorator(func):
		@functools.wraps(func)
		def wrapper(*args,**kw):
			print("%s %s();" % (text,func.__name__))
			f =  func(*args,**kw)
			print("end %s();" % (func.__name__))
			return f
		return wrapper
	return decorator

@log("run")
def _now():
	print('2016-5-12')
_now()
print(_now.__name__)